/**
 * 询价.COM v1.0.0
 * http://xun-jia.com/
 *
 * Copyright (c) 2009 
 * 四川漾天空网络科技有限公司
 * 成都市天府软件园A3栋2楼
 *
 */
package com.xunjia.login.action;

import java.util.Map;

import org.apache.log4j.Logger;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.xunjia.exception.XunjiaException;
import com.xunjia.util.Constants;
import com.xunjia.util.StringUtil;
import com.yam.michael.hibernate.pojo.UserInfo;
import com.yam.michael.service.IUserService;

/**
 * @author Mark
 * 
 * @Email Mark_yang@xun-jia.com
 * 
 * @Date 2009-4-2 上午10:07:24
 * 
 */
public class LoginAction extends ActionSupport {
	// 日誌
	private static final Logger logger = Logger.getLogger(LoginAction.class);
	// 序列码
	private static final long serialVersionUID = 7623822044566802845L;
	// 用户登陆DAO
	private IUserService userService;
	// 登陆类型
	private String type;
	// 用户名
	private String username;
	// 密码
	private String password;
	// 验证码
	private String authcode;

	/*
	 * 用户登陆操作Action执行方法入口 (non-Javadoc)
	 * 
	 * @see com.opensymphony.xwork2.ActionSupport#execute()
	 */
	@Override
	public String execute() throws Exception {
		try {
			// 登陆用户
			UserInfo user = null;
			// 用戶類型
			String userType = "";
			// 密码
			String pass = "";
			// 所屬企業ID
			String belongsCompanyiD = "";
			// 是否是子管理员
			String managerLevel = "";
			// SESSION中是否存在验证码,如果存在,且用户没有输入,则返回
			String auth = StringUtil.getString(ActionContext.getContext().getSession().get(Constants.AUTH_CODE));
			if (auth != null) {
				if (StringUtil.isEmpty(authcode)) {
					addFieldError("authcode", getText("login.authcode.input"));
					// 設置登陸錯誤次數
					return setSessionContent();
				} else if (!authcode.equals(auth)) {
					addFieldError("authcode", getText("login.authcode.error"));
					// 設置登陸錯誤次數
					return setSessionContent();
				}
			}
			user = userService.login(username);
			// 如果存在該用戶
			if (user != null) {
				// 密碼
				pass = user.getPassword();

				// 所屬企業ID
				belongsCompanyiD = StringUtil.getString(user.getCompanyID());
				// 子管理员
				String level = user.getUserType();
				if (Constants.USER_TYPE_DB_MANAGER.equals(level)) {
					// 子管理员
					managerLevel = Constants.SUB_MANAGER;
					// 企業用戶
					userType = Constants.USER_TYPE_COMPANY;
				} else if (Constants.USER_TYPE_DB_SUPER_MANAGER.equals(level)) {
					// 父管理员
					managerLevel = Constants.PARENT_MANAGER;
					// 企業用戶
					userType = Constants.USER_TYPE_COMPANY;
				} else if (Constants.USER_TYPE_DB_INDIVIDUAL.equals(level)) {
					// 個人用戶
					userType = Constants.USER_TYPE_PERSON;
				}
				if (pass.equals(password)) {// 登陆成功
					// 保存用戶信息
					ActionContext.getContext().getSession().put(Constants.SESSION_USER, user);
					// 保存用戶類型信息
					ActionContext.getContext().getSession().put(Constants.USER_TYPE, userType);
					// 保存企業用戶所屬企業ID
					ActionContext.getContext().getSession().put(Constants.SESSION_USER_BELONG_COMPANY_ID, belongsCompanyiD);
					// 管理员类型
					ActionContext.getContext().getSession().put(Constants.SESSION_SUB_MANAGER, managerLevel);
					// 用户ID
					ActionContext.getContext().getSession().put(Constants.SESSION_USER_ID, username);
				} else {
					// 添加登陸錯誤信息
					addFieldError("username", getText("login.validation.error"));
					// 設置登陸錯誤次數
					return setSessionContent();
				}
			} else {
				// 添加登陸錯誤信息
				addFieldError("username", getText("login.validation.error"));
				// 設置登陸錯誤次數
				return setSessionContent();
			}
		} catch (XunjiaException e) {
			logger.info(e.getMessage());
			return Action.INPUT;
		}
		return Action.SUCCESS;
	}

	/**
	 * 设置Session内容
	 */
	private String setSessionContent() {
		// 獲取SESSION
		Map<String, Object> session = ActionContext.getContext().getSession();
		// 獲取登陸錯誤次數
		Object count = session.get(Constants.SESSION_LOGIN_FAILURE);
		// 如果還沒有記錄登陸錯誤次數
		if (count == null) {
			// 設置登陸錯誤次數為1
			session.put(Constants.SESSION_LOGIN_FAILURE, 1);
		} else {
			// 在原來的錯誤次數基礎上加1
			session.put(Constants.SESSION_LOGIN_FAILURE, (Integer) count + 1);
		}
		// 添加ActionMessage
		addActionMessage(String.valueOf(session.get(Constants.SESSION_LOGIN_FAILURE)));
		// 返回登陸不成功
		return Action.INPUT;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	/**
	 * @return the type
	 */
	public String getType() {
		return type;
	}

	/**
	 * @param type
	 *            the type to set
	 */
	public void setType(String type) {
		this.type = type;
	}

	/**
	 * @return the authcode
	 */
	public String getAuthcode() {
		return authcode;
	}

	/**
	 * @param authcode
	 *            the authcode to set
	 */
	public void setAuthcode(String authcode) {
		this.authcode = authcode;
	}

	/**
	 * @return the userService
	 */
	public IUserService getUserService() {
		return userService;
	}

	/**
	 * @param userService
	 *            the userService to set
	 */
	public void setUserService(IUserService userService) {
		this.userService = userService;
	}
}
